<?php
namespace Web\Controller;


use Common\Model\MemberModel;
use Common\Model\MemChainModel;
use Common\Model\OrderModel;
use Common\Model\RechargeModel;
use Common\Model\SystemMsgModel;
use Common\Model\WalletBillModel;
use Notify\Controller\RechargeBaseController;
use Think\Log;
use Web\Controller\WebbaseController;

/**
 * 支付宝支付
 * Class IndexController
 * @package Web\Controller
 */

class AlipayController extends WebbaseController
{

    public $order_model;
    public $system_msg_model;
    public $member_model;
    public $mem_chain_model;

    public function __construct()
    {
        parent::__construct();
        $this->_initialize();
        $this->order_model = new OrderModel();
        $this->system_msg_model = new SystemMsgModel();
        $this->member_model     = new MemberModel();


    }

    public function _initialize()
    {
        vendor('AliWapPay.AlipayTradeService');
//        vendor('Alipay_PC.Md5function');
//        vendor('Alipay_PC.Notify');
//        vendor('Alipay_PC.Submit');

    }

    /******************************
     * 服务器异步通知页面方法
     * 其实这里就是将notify_url.php文件中的代码复制过来进行处理
     *******************************/
    function notifyurl()
    {

        $arr=$_POST;
        $config = C('ali_wap_pay');
        $alipaySevice = new \AlipayTradeService($config);
        $alipaySevice->writeLog(var_export($_POST,true));
        $result = $alipaySevice->check($arr);

        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
//        $result = true;
        if($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代


            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

            //商户订单号

            $out_trade_no = $_POST['out_trade_no'];

            //支付宝交易号

//            $trade_no = $_POST['trade_no'];

            //交易状态
            $trade_status = $_POST['trade_status'];
            $data_order = $this->order_model->where(['order_sn' => $out_trade_no])->find();

            $order_id = $data_order['id'];
            $mid = $data_order['mid'];

            if($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {

                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序

                //注意：
                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
                //支付宝返回参数
//                $out_trade_no = $this->order_info['out_trade_no'];
                $time = date('Y-m-d H:i:s');
                //修改订单状态
                $data_order['pay_type'] = OrderModel::PAY_TYPE_ALIPAY;
                $data_order['pay_time'] = $time;
                $data_order['status'] = OrderModel::STATUS_PAY_SUCCESS;
                $data_order['update_time'] = $time;

                $this->order_model->startTrans();
                $is_commit = true;

                if($this->order_model->where(['id' => $order_id])->save($data_order) == false) {
                    $is_commit = false;$error = '2';
                }

                //提交事务
                if ($is_commit) {
                    $this->order_model->commit();
//                    exit($this->returnApiSuccess());
                } else {
                    $this->order_model->rollback();
//                    exit($this->returnApiError(WapBaseController::FATAL_ERROR, '支付失败'.$error));
                }
            }
            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            echo "success";		//请不要修改或删除

        }else {
            //验证失败
            Log::record('alipay支付:' . json_encode($arr), Log::WARN);
            echo "fail";	//请不要修改或删除

        }
    }

    /******************************
     * 服务器异步通知页面方法
     * 其实这里就是将notify_url.php文件中的代码复制过来进行处理
     *******************************/
    function notifyurlrecharge()
    {
        $arr=$_POST;
        $config = C('ALIPAY_CONFIG');
        $alipaySevice = new \AlipayTradeService($config);
        $alipaySevice->writeLog(var_export($_POST,true));
        $result = $alipaySevice->check($arr);

        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
//        $result = true;
        if($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代


            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

            //商户订单号

            $out_trade_no = $_POST['out_trade_no'];

            //支付宝交易号

//            $trade_no = $_POST['trade_no'];

            //交易状态
            $trade_status = $_POST['trade_status'];


            if($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {

                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序

                //注意：
                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
                //支付宝返回参数
//                $out_trade_no = $this->order_info['out_trade_no'];
                $total_fee = $arr['total_fee'];
                $data_order = $this->recharge_model->where(['out_trade_no' => $out_trade_no])->find();
//                dump($data_order);exit;
                //订单状态和金额检查
                if (!$this->chechValidity($out_trade_no, $total_fee)) {
                    //错误日志
                    Log::record('充值检测异常,订单号为:' . $out_trade_no . '/n', Log::WARN);
                    exit;
                }
//                $arr = $data_order;

                //钱包金额变动
                if (!$this->compute(RechargeModel::PAY_TYPE_ALIPAY, json_encode($arr))) {
                    Log::record('alipay充值:' . json_encode($arr), Log::WARN);
                    exit;
                }
            }
            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            echo "success";		//请不要修改或删除

        }else {
            //验证失败
            Log::record('alipay充值:' . json_encode($arr), Log::WARN);
            echo "fail";	//请不要修改或删除

        }
    }




    /*
        页面跳转处理方法；
        这里其实就是将return_url.php这个文件中的代码复制过来，进行处理；
        */
    function returnurl()
    {

        //头部的处理跟上面两个方法一样，这里不罗嗦了！
        $alipay_config = C('alipay_config');
//        dump($alipay_config);exit;

        $alipayNotify = new  \ AlipayNotify($alipay_config);//计算得出通知验证结果
        $verify_result = $alipayNotify->verifyReturn();

            //验证成功
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
            $out_trade_no = $_GET['out_trade_no'];      //商户订单号
            $trade_no = $_GET['trade_no'];          //支付宝交易号
            $trade_status = $_GET['trade_status'];      //交易状态
            $total_fee = $_GET['total_fee'];         //交易金额
            $notify_id = $_GET['notify_id'];         //通知校验ID。
            $notify_time = $_GET['notify_time'];       //通知的发送时间。
            $buyer_email = $_GET['buyer_email'];       //买家支付宝帐号；

            $parameter = array(
                "out_trade_no" => $out_trade_no,      //商户订单编号；
                "trade_no" => $trade_no,          //支付宝交易号；
                "total_fee" => $total_fee,         //交易金额；
                "trade_status" => $trade_status,      //交易状态
                "notify_id" => $notify_id,         //通知校验ID。
                "notify_time" => $notify_time,       //通知的发送时间。
                "buyer_email" => $buyer_email,       //买家支付宝帐号
            );

            if ($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {

                redirect(C('alipay.successpage'));//跳转到配置项中配置的支付成功页面；

            } else {
                echo "trade_status=" . $_GET['trade_status'];
                redirect(C('alipay.errorpage'));//跳转到配置项中配置的支付失败页面；
            }


    }


    /**
     * 商品
     * 库存变更
     * 销量变更
     */
    public function product_change($order_id)
    {
        if (!$order_id) return false;
        $order_data = $this->order_model->find($order_id);

        $order_product_data = $this->order_product_model->where(['order_id' => $order_data['id']])->select();

        foreach ($order_product_data as $k => $v) {
            $v['snapshot'] = json_decode($v['snapshot'], true);
            $this->product_model
                ->where(['id' => $v['product_id']])
                ->save(['sales_volume' => ['exp', 'sales_volume+' . $v['quantity']]]);
            $this->product_option_model
                ->where(['option_key_id' => $v['snapshot']['option_key_id']])
                ->save(['inventory' => ['exp', 'inventory-' . $v['quantity']]]);
        }
        return true;
    }
}